package com.zx.deploy.service.impl;

import java.io.File;

import org.apache.log4j.Logger;
import org.apache.tools.zip.ZipOutputStream;
import org.springframework.stereotype.Service;

import com.zx.deploy.common.utils.FileMD5Util;
import com.zx.deploy.common.utils.GZipUtil;
import com.zx.deploy.common.utils.RSAUtil;
import com.zx.deploy.config.DeployConfig;
import com.zx.deploy.service.PackageService;

/**
 * md5打包程序实现
 * 
 * @author jbyu
 *
 */
@Service
public class Md5PackageServiceImpl implements PackageService {

	private static  Logger logger  =  Logger.getLogger(Md5PackageServiceImpl.class);
	
	@Override
	public void setPackage(String soft_unzip_name,String soft_package_name) throws Exception {
		//需要打包文件的路径
		String pack_path=Md5PackageServiceImpl.class.getClassLoader().getResource("build/").getPath();
		//压缩文件目录
		File inputFile=new File(pack_path+soft_unzip_name);
		logger.info("======待压缩文件夹目录===="+pack_path+soft_unzip_name);
		File gzFile = new File(pack_path+soft_package_name);
		logger.info("======压缩包文件具体路径===="+pack_path+soft_package_name);
		//存在之前的压缩包就先删除
		if(gzFile.exists()) {
			gzFile.delete();
		}
		gzFile.createNewFile();
		logger.info("======生成压缩包文件输入流====");
		ZipOutputStream zipoutput= new ZipOutputStream(gzFile);
		logger.info("======递归调用压缩目录====");
		GZipUtil.compressDirectory(inputFile,zipoutput,"");
		zipoutput.close();
		logger.info("==========压缩完成====="+pack_path+soft_package_name);
	}

	
	@Override
	public String setMd5AndVersion(String soft_package_name) throws Exception {
		String pack_path=Md5PackageServiceImpl.class.getClassLoader().getResource("build/").getPath();
		logger.info("======开始计算md5的值====");
		String gzFilePath=pack_path+soft_package_name;
		//1、计算压缩包的md5
		String gzFileMd5=FileMD5Util.getMD5BigFile(gzFilePath);
		logger.info("======计算md5的值："+gzFileMd5+"====");
		//2、计算version版本信息
		String version=Long.toString(System.currentTimeMillis());
		logger.info("======计算version的值："+version+"====");
		//3、计算写入头信息
		String headInfo="md5:"+gzFileMd5+"|version:"+version;
		logger.info("======计算头信息："+headInfo+"====");
		//4、进行加密
		String rsaEncryptHeadInfo=RSAUtil.encrypt(headInfo);
		logger.info("======加密后的头信息："+rsaEncryptHeadInfo+"====");
		//5、将加密信息写入，gz头部
		byte[] encryHeadByte=rsaEncryptHeadInfo.getBytes();
		
		GZipUtil.appendFileHeader(encryHeadByte, gzFilePath);
		logger.info("======加密后的头信息写入压缩包流成功=======");
		return gzFilePath;
	}
	
	
}
